package projeto.administrativo.usuarios.cgt;

import nucleo.global.ContextoSessao;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.dao.SaltSource;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.zkoss.zkplus.spring.SpringUtil;

import plataforma.autenticacao.cdp.Usuario;
import plataforma.crud.cgt.ServiceCrud;
import plataforma.crudestatico.cgd.DaoBase;
import plataforma.log.cdp.OperacaoLog;
import plataforma.log.cgt.ServiceLog;
import projeto.administrativo.usuarios.cgd.DaoUsuario;

@Service
public class ServiceUsuario extends ServiceCrud<Usuario> {

	@Autowired
	private PasswordEncoder passwordEncoder;

	@Autowired
	private SaltSource saltSource;

	@Autowired
	DaoUsuario daoUsuario;

	public DaoUsuario getDaoGrupo() {
		return daoUsuario;
	}

	public void setDaoGrupo(DaoUsuario daoUsuario) {
		this.daoUsuario = daoUsuario;
	}

	@Override
	public DaoBase<Usuario> getNucleoDaoBase() {

		return daoUsuario;
	}

	@Override
	public void salvar(Usuario objeto) throws BeansException, Exception {
		OperacaoLog operacaoEscolhida = OperacaoLog.EDITAR;

		if (objeto.getId() == null) {
			operacaoEscolhida = OperacaoLog.INCLUIR;
			criptografarSenha(objeto);

		}

		getNucleoDaoBase().salvar(objeto);

		// esconde a senha do log
		objeto.setPassword("xxxxxxxx");
		Usuario usuarioLogado = ContextoSessao.getUsuarioLogado();
		// gerar log
		SpringUtil.getApplicationContext().getBean(ServiceLog.class)
				.inserirLogSimples(objeto, operacaoEscolhida, usuarioLogado);
	}

	public void criptografarSenha(Usuario usuario) {

		String encodedPassword = passwordEncoder.encodePassword(
				usuario.getPassword(), saltSource.getSalt(usuario));

		usuario.setPassword(encodedPassword);
		// String encodedPasswordSemSalto =
		// passwordEncoder.encodePassword(senhaEmClaro,null);

		// System.out.println("Senha clara: " + senhaEmClaro);
		// System.out.println("Com Salto: "+ encodedPassword);

		// System.out.println("sem salto: "+encodedPasswordSemSalto);

	}

	public PasswordEncoder getPasswordEncoder() {
		return passwordEncoder;
	}

	public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
		this.passwordEncoder = passwordEncoder;
	}

	public SaltSource getSaltSource() {
		return saltSource;
	}

	public void setSaltSource(SaltSource saltSource) {
		this.saltSource = saltSource;
	}

}
